{"componentChunkName":"component---src-templates-post-js","path":"/blog/static-methods-properties","result":{"data":{"markdownRemark":{"html":"<p>\n<span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 700px;\"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/4a274bf8f90684df1ac2929a2d6e743e/797d6/thumbnail.jpg\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 65.14285714285714%; position: relative; bottom: 0; left: 0; background-image: url('data:image/svg+xml,%3csvg%20xmlns=\\'http://www.w3.org/2000/svg\\'%20width=\\'400\\'%20height=\\'260\\'%20viewBox=\\'0%200%20400%20260\\'%20preserveAspectRatio=\\'none\\'%3e%3cpath%20d=\\'M0%20130v130h401V0H0v130m31-95v11h4l4-1c0-1-1-2-3-2h-3v-8c0-11%202-12%208-4l4%204c1%200%201-1-4-7-3-3-4-4-7-4h-3v11m13-10c-1%201%200%201%201%201h3c1%200%202%203%202%209%200%208%200%208-2%208s-4-2-6-5c-3-4-5-5-5-3l4%206c3%204%204%205%207%205h4V24h-4l-4%201m310%203l-2%204-2%202%202%203%202%204c0%203%201%203%204%202h4c2%201%205%200%205-3l2-3%202-3-2-2-2-4c0-3-3-4-5-2h-3l-3-1c-2%200-2%200-2%203M33%2066c-2%200-2%201-2%208v7h5l6-1c1-1%200-6-1-6v-2c2-4-2-7-8-6m184%206c-4%204-2%209%203%209%204%200%206-2%206-5%200-5-6-8-9-4m51%2029l-1%205c1%203%200%203-3%202-6-2-11%202-11%2010%200%207%207%2012%2013%209%202-2%202-2%204-1l3%202%201-13v-13c-1-2-6-3-6-1M31%20114v13h3c3%200%203-1%203-4%200-6%204-6%207%200%202%203%203%204%206%204h3l-2-4-3-5%202-3c5-8%200-14-12-14h-7v13m91-12l-1%203-1%203-1%202%201%202%201%206c0%208%202%2011%208%209%204%200%204-5%201-5-4-1-4-10-1-10l2-2-2-2c-2%200-2-1-2-3%200-3%200-4-2-4l-3%201m86%2012v13h3c3%200%203%200%203-4%200-6%204-5%207%200%201%203%202%204%205%204%204%200%204%200%201-5-2-4-3-5%200-7%202-2%201-8-1-11s-3-3-10-3h-8v13m-147-6c-6%201-9%2010-5%2016%202%203%208%205%2013%202l4-3c0-1-4-2-5-1-2%202-8%201-8-2l8-1c8%200%208-1%205-6-1-3-6-6-9-6l-3%201m21%200c-4%201-5%202-4%204s1%202%204%201%206-1%206%201l-4%201c-9%200-11%2010-3%2013l5-1%204-1%205%201c2-2%200-14-2-17-3-2-7-3-11-2m89%200c-3%201-6%205-5%207l5%204%205%203h-6c-2-1-3-1-4%201s1%204%207%204c10%201%2013-8%204-11l-5-3h6c2%201%202%201%203-1%202-3-5-6-10-4m20%200c-3%200-7%206-7%2010%200%208%2011%2013%2018%207l2-2-2-1h-5c-2%202-5%201-6-1%200-2%201-2%207-2%207%200%207%200%207-2%200-6-7-11-14-9m45%201c-9%204-7%2016%203%2019%203%200%2010-2%2011-5%200-2-4-2-7-1-2%201-5%201-6-2l7-1c8%200%209-1%205-7-2-5-8-6-13-3m70-1c-10%205-7%2020%204%2020%204%200%206-1%207-3%203-3%202-3-4-3s-8-2-6-7c1-2%201-2%206-2%206%201%208%200%205-3-3-2-8-3-12-2m23%200c-4%200-8%205-8%2010%200%208%2011%2013%2018%207l2-3h-7c-1%202-6%200-6-2l7-1h7v-3c-2-6-6-9-13-8m24%201h-8v16c0%202%201%202%203%202%203-1%203-1%203-8%200-4%200-4%203-5%202-1%203-2%203-4%200-3%200-4-4-1m-252%202c-8%207%201%2020%2011%2016%207-3%206-7-1-5-5%200-7-1-7-4%200-4%202-5%207-4%205%200%207-1%204-4s-11-3-14%201m42%204c0%2011%203%2015%2010%2012%203-2%204-2%206%200%203%202%205%201%204-3l-1-9c0-7%200-7-3-7h-3v6c0%207%200%207-3%208-3%200-4-1-4-8%200-6%200-6-3-6h-3v7m135%201c0%2011%203%2014%2010%2011l4-1%203%201c2%200%202%200%202-2v-17h-3c-3%200-3%200-3%206-1%207-2%209-5%208-2-1-2-2-2-7v-7h-6v8\\'%20fill=\\'%2345aaf2\\'%20fill-rule=\\'evenodd\\'/%3e%3c/svg%3e'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"static methods and properties in js\"\n        title=\"static methods and properties in js\"\n        src=\"/static/4a274bf8f90684df1ac2929a2d6e743e/03346/thumbnail.jpg\"\n        srcset=\"/static/4a274bf8f90684df1ac2929a2d6e743e/71299/thumbnail.jpg 175w,\n/static/4a274bf8f90684df1ac2929a2d6e743e/1e9fe/thumbnail.jpg 350w,\n/static/4a274bf8f90684df1ac2929a2d6e743e/03346/thumbnail.jpg 700w,\n/static/4a274bf8f90684df1ac2929a2d6e743e/c3223/thumbnail.jpg 1050w,\n/static/4a274bf8f90684df1ac2929a2d6e743e/797d6/thumbnail.jpg 1080w\"\n        sizes=\"(max-width: 700px) 100vw, 700px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n  </a>\n    </span></p>\n<p>One of the feature related to properties and methods which exists in javascript es6 or later is static properties and methods.</p>\n<p>It allows us to add properties and methods to classes that are not accessed on an instance of a class, meaning that you don’t need to call <code class=\"language-text\">new ClassName</code> first, you can just access them directly on the class. It is often utility functions or global constants which you want to store in a class.</p>\n<p>An example built into javascript is the math constructor function or class that’s globally available, where you can access PI as a constant value to get the number of PI, or functions or methods like POW to calculate the power of a number. These are methods and properties which you don’t access on the instance of math (there is no need to call <code class=\"language-text\">new Math</code> first, but you can access the properties and methods directly on the class itself. so in this example, <code class=\"language-text\">math</code> acts more like a namespace which is a common use case for static methods and properties and we can add them to our classes as well.</p>\n<p>For example, let’s define a <code class=\"language-text\">Rectangle</code> class with <code class=\"language-text\">width</code> and <code class=\"language-text\">height</code> properties:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">Rectangle</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">height<span class=\"token punctuation\">,</span> width</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>height <span class=\"token operator\">=</span> height<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>width <span class=\"token operator\">=</span> width<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Now we want a method that helps us calculate the area of the rectangle:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">Rectangle</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">height<span class=\"token punctuation\">,</span> width</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>height <span class=\"token operator\">=</span> height<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>width <span class=\"token operator\">=</span> width<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\t<span class=\"token function\">getArea</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token keyword\">return</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">Area is: </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>width<span class=\"token operator\">*</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>height<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Let’s say we want a new rectangle:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> rectangle1 <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Rectangle</span><span class=\"token punctuation\">(</span><span class=\"token number\">50</span><span class=\"token punctuation\">,</span> <span class=\"token number\">20</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>rectangle1<span class=\"token punctuation\">.</span><span class=\"token function\">getArea</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Here the console output: <code class=\"language-text\">Area is: 1000</code></p>\n<p>Now we want to be able to access <code class=\"language-text\">getArea</code> without instantiating <code class=\"language-text\">Rectangle</code> ,because we don’t really want to instantiate <code class=\"language-text\">Rectangle</code> just to call a utility method. </p>\n<p>So we can add the <code class=\"language-text\">static</code> keyword in front of <code class=\"language-text\">getArea</code> method and pass <code class=\"language-text\">width</code> and <code class=\"language-text\">height</code> as properties to the method instead of using <code class=\"language-text\">this</code> :</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">Rectangle</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">height<span class=\"token punctuation\">,</span> width</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>height <span class=\"token operator\">=</span> height<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>width <span class=\"token operator\">=</span> width<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\t<span class=\"token keyword\">static</span> <span class=\"token function\">getArea</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">width<span class=\"token punctuation\">,</span> height</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token keyword\">return</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">Area is: </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>width<span class=\"token operator\">*</span>height<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Now we can just call the <code class=\"language-text\">getArea</code> method directly on the <code class=\"language-text\">Rectangle</code> class without the <code class=\"language-text\">new</code> keyword and therefore we used the class as a namespace:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> rectangle1 <span class=\"token operator\">=</span> Rectangle<span class=\"token punctuation\">.</span><span class=\"token function\">getArea</span><span class=\"token punctuation\">(</span><span class=\"token number\">50</span><span class=\"token punctuation\">,</span> <span class=\"token number\">20</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>rectangle1<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>The output would be: <code class=\"language-text\">Area is: 1000</code></p>\n<p>If you’d want to add a static property to your class, just use the <code class=\"language-text\">static</code> keyword in front of your property.</p>\n<p>For example, to add a unit of measurement to our <code class=\"language-text\">Rectangle</code> class, we can define a <code class=\"language-text\">unit</code> property:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">Rectangle</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">height<span class=\"token punctuation\">,</span> width</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>height <span class=\"token operator\">=</span> height<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>width <span class=\"token operator\">=</span> width<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\t<span class=\"token keyword\">static</span> <span class=\"token function\">getArea</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">width<span class=\"token punctuation\">,</span> height</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token keyword\">return</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">Area is: </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>width<span class=\"token operator\">*</span>height<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span>\n\t<span class=\"token keyword\">static</span> unit <span class=\"token operator\">=</span> <span class=\"token string\">'centimeter'</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Now if we log the unit:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>Rectangle<span class=\"token punctuation\">.</span>unit<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>The output would be: <code class=\"language-text\">centimeter</code></p>\n<p>One thing we should keep in mind is when we add them to a class, we can’t access them from the none-static parts of the class. So if we tried to access <code class=\"language-text\">unit</code> inside constructor, it won’t work:</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">Rectangle</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">height<span class=\"token punctuation\">,</span> width</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>height <span class=\"token operator\">=</span> height<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>width <span class=\"token operator\">=</span> width<span class=\"token punctuation\">;</span>\n\t\tconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>unit<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\t<span class=\"token keyword\">static</span> <span class=\"token function\">getArea</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">width<span class=\"token punctuation\">,</span> height</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token keyword\">return</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">Area is: </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>width<span class=\"token operator\">*</span>height<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span>\n\t<span class=\"token keyword\">static</span> unit <span class=\"token operator\">=</span> <span class=\"token string\">'centimeter'</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>We’ll get the following error:</p>\n<p><code class=\"language-text\">Property &#39;unit&#39; is a static member of type &#39;Rectangle&#39;</code></p>\n<p>So we can’t access it because the constructor and all the other methods that are not marked with <code class=\"language-text\">static</code> will not be able to access static properties, because <code class=\"language-text\">this</code> refers to the instance created based on the class and the static property is not available on an instance since the idea behind static properties and static methods is the fact that they are detached from instances.</p>\n<p>If you want to use static property or methods from inside the class, you’d have to use the class name:\nIn the end we need to use dispatch our actions in <code class=\"language-text\">addTodo()</code> and <code class=\"language-text\">removeTodo()</code> methods in order to change the state:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">Rectangle</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">height<span class=\"token punctuation\">,</span> width</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>height <span class=\"token operator\">=</span> height<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>width <span class=\"token operator\">=</span> width<span class=\"token punctuation\">;</span>\n\t\tconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>Rectangle<span class=\"token punctuation\">.</span>unit<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\t<span class=\"token keyword\">static</span> <span class=\"token function\">getArea</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">width<span class=\"token punctuation\">,</span> height</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token keyword\">return</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">Area is: </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>width<span class=\"token operator\">*</span>height<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span>\n\t<span class=\"token keyword\">static</span> unit <span class=\"token operator\">=</span> <span class=\"token string\">'centimeter'</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h2>References</h2>\n<p><a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes/static\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">MDN</a></p>","frontmatter":{"title":"Static Methods & Properties in JS","description":"In this post we're going to discuss the differences between regular and static methods and properties","date":"2021-10-24","slug":"/blog/static-methods-properties","tags":["Javascript","ES6","Static","OOP"]}}},"pageContext":{}}}